﻿Imports MySql.Data.MySqlClient

Public Class frmTratadoraProcesar
    Dim ofd As New OpenFileDialog
    Dim fbd As New FolderBrowserDialog

    Dim group As String
    Dim varDate As String
    Dim time As String
    Dim usuario_tratadora As String
    Dim message() As String

    Dim procesados As Integer = 0
    Dim repetidos As Integer = 0
    Dim insertados As Integer = 0
    Dim incorrectos As Integer = 0

    Private Sub frmTratadoraProcesar_load(sender As Object, e As EventArgs) Handles MyBase.Load
        Inicializar()

        Me.Text = "TRATADORA - Procesar: " & varTituloTratadora
        Me.lblTitulo.Text = "TRATADORA: " & varTituloTratadora

    End Sub

    Private Sub btnLote_Click(sender As Object, e As EventArgs) Handles btnLote.Click

        Try

            Dim f As New frmTratadoraProcesarPregunta
            f.Tag = "LOTE"
            f.ShowDialog()

            'If MsgBox("¿Desea descargar y procesar los archivos de LOTE automáticamente?", vbExclamation + vbYesNo, "ATENCIÓN") = vbNo Then
            If f.Tag = "PENDRIVE" Then
                'Manualmente
                'Abro
                ofd.Filter = "CSV files (*.CSV)|*.csv"
                ofd.FilterIndex = 1
                ofd.RestoreDirectory = True
                ofd.Multiselect = True

                If ofd.ShowDialog = Windows.Forms.DialogResult.OK AndAlso ofd.FileName <> "" Then
                    If ofd.FileNames.Count > 0 Then
                        btnLoteProcesar.Visible = True
                        Inicializar()
                        lblLoteNumero.Text = ofd.FileNames.Count
                    End If
                End If

            ElseIf f.Tag = "RED" Then 'Automaticamente
                'Obtengo datos de conexion a la tratadora
                Dim dr As MySqlDataReader
                Dim ip As String
                Dim usuario As String
                Dim clave As String

                'Obtengo datos de la tratadora que voy a procesar
                sql = "SELECT ip, usuario, clave FROM tratadoras WHERE id=" & varIdTratadora
                Dim cmd As New MySqlCommand(sql)
                dr = cn.getResultados(cmd)

                'Esta validacion no deberia ser cierta nunca
                If dr.HasRows = False Then
                    MsgBox("No se encontró la tratadora con id " & varIdTratadora, vbExclamation + vbOKOnly, "Atención")
                    dr.Close()
                    Exit Sub
                End If

                'Como es un solo registro no lo recorro
                'While dr.Read()
                dr.Read()
                ip = dr("ip")
                usuario = dr("usuario")
                clave = dr("clave")
                'End While

                dr.Close()
                cn.Cerrar()

                If ip = "" Then
                    MsgBox("La tratadora " & varNombreTratadora & " no tiene una IP asignada y por lo tanto no pueden procesarse los archivos automáticamente. Debe seleccionar los archivos manualmente para poder procesarlos", vbOKOnly + vbExclamation, "Atención")
                    Exit Sub
                End If

                'Descargo archivos
                DescargarArchivos("lote", ip, usuario, clave)

                SeleccionarArchivos("lote")

                ProcesarLote()

                EliminarArchivos("lote")

                'Si no se descargaron archivos aviso
                If lblArchivos.Text = 0 Then
                    'MsgBox("No se descargó ningún archivo de la tratadora " & Chr(13) & "Puede haber algun problema de conexión", vbOKOnly + vbInformation)
                    Dim frmErrorConexion As New frmTratadoraProcesarErrorConexion
                    frmErrorConexion.Show()
                End If
            End If

        Catch ex As Exception
            MensajeError()
        End Try

    End Sub

    Private Sub btnLoteProcesar_Click(sender As Object, e As EventArgs) Handles btnLoteProcesar.Click

        Try
            Me.Cursor = System.Windows.Forms.Cursors.WaitCursor

            'cn.BeginTransaction() Lo deshabilito porque los archivos pueden repetir registros de archivos anteriores y entonces no se puede hacer un contador correcto de registros a insertar

            'Recorro todos los archivos seleccionados
            For Each file As String In ofd.FileNames

                Dim CSVTest As List(Of String) = New List(Of String)
                'Read the file and put each line into a list.  Each line will be an item with subitems in the listview
                CSVTest = System.IO.File.ReadAllLines(file).ToList

                'This adds the rest of the data from the file to the listview.  If the first line of the file is data and not header text, then change `For I = 1 To CSVTest.Count - 1` to `For I = 0 To CSVTest.Count - 1`
                'Recorro cada registro del archivo empezando por I=3 (linea 4 ya que cuenta desde 0)
                For I = 3 To CSVTest.Count - 1
                    procesados = procesados + 1
                    Dim col() As String = CSVTest(I).Split(ControlChars.NewLine)
                    Dim NewLVItem As ListViewItem = New ListViewItem(col(0))
                    NewLVItem.Name = col(0)

                    For j = 1 To col.Count - 1
                        NewLVItem.SubItems.Add(col(j))
                    Next

                    Dim Text, DelimitedText() As String, Delimiter As Char = ControlChars.Tab
                    Text = NewLVItem.Name
                    DelimitedText = Text.Split(ControlChars.Tab)

                    'Separo cada campo separado por TABULACION del registro
                    For k = 0 To DelimitedText.GetUpperBound(0)
                        If DelimitedText(k).Trim <> "" Then
                            Select Case k
                                Case 0
                                    group = DelimitedText(k)
                                Case 1 'Date
                                    varDate = "20" & DelimitedText(k)
                                    'varDate = DelimitedText(k)
                                Case 2 'Time
                                    time = DelimitedText(k)
                                Case 3 'User Name
                                    usuario_tratadora = DelimitedText(k)
                                Case 4 'Message
                                    'Separo cada valor separado por "," del campo message
                                    message = Split(DelimitedText(k), ",")
                                Case Else
                                    MsgBox("El archivo que esta procesando tiene más campos que los esperados", vbExclamation + vbOKOnly, "Atención")
                                    Exit Sub

                            End Select
                        End If
                    Next

                    'VALIDO ENCABEZADO-------------------------------
                    'Chequeo si el grupo del archivo es correcto
                    If group <> "LOTE" Then
                        'cn.RollbackTransaction()
                        Me.Cursor = System.Windows.Forms.Cursors.Default
                        MsgBox("El archivo ingresado no pertenece a la tipologia elegida. Por favor ingrese un archivo válido", vbExclamation + vbOKOnly, "ATENCIÓN")
                        btnLoteProcesar.Visible = False
                        Exit Sub
                    End If

                    'Hago esto para descomponer message(0) que es el nombre de la tratadora y agregarle ceros a la izquierda de la serie hasta llegar a 3 digitos
                    Dim strNombreTratadora
                    strNombreTratadora = Strings.Left(message(0), InStr(message(0), "-"))
                    Dim strSerie As String
                    strSerie = Strings.Right(message(0), Len(message(0)) - InStr(message(0), "-"))
                    strSerie = strSerie.PadLeft(3, "0")

                    'Lo vuelvo a componer con los ceros a la izquierda en strSerie
                    message(0) = strNombreTratadora & strSerie

                    'Chequeo si el nombre de la tratadora es la que corresponde a la tratadora seleccionada
                    If message(0) <> varNombreTratadora Then
                        'cn.RollbackTransaction()
                        Me.Cursor = System.Windows.Forms.Cursors.Default
                        MsgBox("Los archivos que intenta procesar pertenecen a la tratadora " & message(0), vbExclamation + vbOKOnly, "ATENCIÓN")
                        btnLoteProcesar.Visible = False
                        lblLoteNumero.Text = 0
                        Exit Sub
                    End If
                    '-------------------------------------------------

                    'VALIDO REGISTROS
                    If Validar("lotes") = True Then
                        InsertarRegistro("lotes")
                    End If

                Next

            Next file

            'Resultados
            lblGrupo.Text = "LOTE"
            lblArchivos.Text = ofd.FileNames.Count
            lblProcesados.Text = procesados
            lblIncorrectos.Text = incorrectos
            lblRepetidos.Text = repetidos
            lblInsertados.Text = insertados

            lblLoteNumero.Text = 0
            btnLoteProcesar.Visible = False

            'cn.CommitTransaction()

            Me.Cursor = System.Windows.Forms.Cursors.Default

            MsgBox("Fin de proceso", vbOKOnly + MsgBoxStyle.Information)

        Catch ex As Exception
            'cn.RollbackTransaction()
            Me.Cursor = System.Windows.Forms.Cursors.Default
            MensajeError()

        Finally
            'Limpio contadores
            procesados = 0
            incorrectos = 0
            repetidos = 0
            insertados = 0
        End Try

    End Sub

    Private Sub Inicializar()
        lblLoteNumero.Text = 0
        lblBatchNumero.Text = 0
        lblCalibracionNumero.Text = 0
        lblEventosNumero.Text = 0
        lblAlarmasNumero.Text = 0

        lblGrupo.Text = ""
        lblArchivos.Text = 0
        lblProcesados.Text = 0
        lblIncorrectos.Text = 0
        lblRepetidos.Text = 0
        lblInsertados.Text = 0
    End Sub

    Private Function Validar(tabla As String) As Boolean
        Dim grupo As String

        Select Case tabla
            Case "lotes"
                grupo = "LOTE"
        End Select

        'Lo saqué porque ahora se valida como encabezado
        ''Chequeo si el grupo del archivo es correcto
        'If group <> grupo Then
        '    incorrectos = incorrectos + 1
        '    Return False
        'End If

        'Lo saqué porque ahora se valida como encabezado
        ''Chequeo si el nombre de la tratadora es la que corresponde a la tratadora seleccionada
        'If message(0) <> varNombreTratadora Then
        '    incorrectos = incorrectos + 1
        '    Return False
        'End If

        'Chequeo que no exista el registro buscando por fecha y tratadora_id
        'sql = "Select fecha From " & tabla & " Where fecha='" & Format(varDate, "yyyy-MM-dd") & " " & time & "' and tratadora_id = " & varIdTratadora
        sql = "Select fecha From " & tabla & " Where fecha='" & varDate & " " & time & "' and tratadora_id = " & varIdTratadora
        Dim cmd As New MySql.Data.MySqlClient.MySqlCommand(sql)
        If Not IsNothing(cn.getScalar(cmd)) Then
            repetidos = repetidos + 1
            Return False
        End If

        Return True

    End Function

    Private Sub InsertarRegistro(tabla As String)

        Try

            sql = "INSERT INTO " & tabla & " (variedad, lote, fecha, usuario_tratadora, peneira, razon, cuit, nombre_receta, peso_procesar, consumo_l1, consumo_l2, consumo_l3, consumo_l4, consumo_l5, consumo_l6, consumo_p1, consumo_p2, peso_total, cantidad_batch, tratadora_id) VALUES (@variedad, @lote, @fecha, @usuario_tratadora, @peneira, @razon, @cuit, @nombre_receta, @peso_procesar, @consumo_l1, @consumo_l2, @consumo_l3, @consumo_l4, @consumo_l5, @consumo_l6, @consumo_p1, @consumo_p2, @peso_total, @cantidad_batch, @tratadora_id)"

            Dim cmd As New MySql.Data.MySqlClient.MySqlCommand(sql)

            cmd.Parameters.Add("@variedad", MySqlDbType.VarChar, 50, "variedad")
            cmd.Parameters.Add("@lote", MySqlDbType.VarChar, 50, "lote")
            cmd.Parameters.Add("@fecha", MySqlDbType.DateTime, 8, "fecha")
            cmd.Parameters.Add("@usuario_tratadora", MySqlDbType.VarChar, 50, "usuario_tratadora")
            cmd.Parameters.Add("@peneira", MySqlDbType.VarChar, 50, "peneira")
            cmd.Parameters.Add("@razon", MySqlDbType.VarChar, 50, "razon")
            cmd.Parameters.Add("@cuit", MySqlDbType.VarChar, 50, "cuit")
            cmd.Parameters.Add("@nombre_receta", MySqlDbType.VarChar, 50, "nombre_receta")
            cmd.Parameters.Add("@peso_procesar", MySqlDbType.Double, 12, "peso_procesar")
            cmd.Parameters.Add("@consumo_l1", MySqlDbType.Double, 7, "consumo_l1")
            cmd.Parameters.Add("@consumo_l2", MySqlDbType.Double, 7, "consumo_l2")
            cmd.Parameters.Add("@consumo_l3", MySqlDbType.Double, 7, "consumo_l3")
            cmd.Parameters.Add("@consumo_l4", MySqlDbType.Double, 7, "consumo_l4")
            cmd.Parameters.Add("@consumo_l5", MySqlDbType.Double, 7, "consumo_l5")
            cmd.Parameters.Add("@consumo_l6", MySqlDbType.Double, 7, "consumo_l6")
            cmd.Parameters.Add("@consumo_p1", MySqlDbType.Double, 7, "consumo_p1")
            cmd.Parameters.Add("@consumo_p2", MySqlDbType.Double, 7, "consumo_p2")
            cmd.Parameters.Add("@peso_total", MySqlDbType.Double, 12, "peso_total")
            cmd.Parameters.Add("@cantidad_batch", MySqlDbType.Int32, 5, "cantidad_batch")
            cmd.Parameters.Add("@tratadora_id", MySqlDbType.Int64, 20, "tratadora_id")

            cmd.Parameters("@variedad").Value = message(1)
            cmd.Parameters("@lote").Value = message(2)
            'cmd.Parameters("@fecha").Value = Format(Format(varDate, "yyyy-MM-dd"), "yyyy-MM-dd") & " " & time
            cmd.Parameters("@fecha").Value = varDate & " " & time
            cmd.Parameters("@usuario_tratadora").Value = usuario_tratadora
            cmd.Parameters("@peneira").Value = message(3)
            cmd.Parameters("@razon").Value = message(4)
            cmd.Parameters("@cuit").Value = message(5)
            cmd.Parameters("@nombre_receta").Value = message(6)
            cmd.Parameters("@peso_procesar").Value = message(7)
            cmd.Parameters("@consumo_l1").Value = message(8)
            cmd.Parameters("@consumo_l2").Value = message(9)
            cmd.Parameters("@consumo_l3").Value = message(10)
            cmd.Parameters("@consumo_l4").Value = message(11)
            cmd.Parameters("@consumo_l5").Value = message(12)
            cmd.Parameters("@consumo_l6").Value = message(13)
            cmd.Parameters("@consumo_p1").Value = message(14)
            cmd.Parameters("@consumo_p2").Value = message(15)
            cmd.Parameters("@peso_total").Value = message(16)
            cmd.Parameters("@cantidad_batch").Value = message(17)
            cmd.Parameters("@tratadora_id").Value = varIdTratadora

            cn.ExecNonQuery(cmd)

            insertados = insertados + 1

        Catch ex As Exception
            Throw New Exception(Err.Description)
        End Try

    End Sub

    Private Sub DescargarArchivos(group As String, ip As String, usuario As String, clave As String)
        Dim comando As String
        Dim carpeta As String

        Select Case group
            Case "lote"
                carpeta = "LOTES"
        End Select

        comando = "datatransfertool -ip " & ip & " -user " & usuario & " -pwd " & clave & " -get -secondary -remotedatafolder Alarm/" & carpeta & " -localfolder c:\ALARM\" & carpeta & " -r"

        Dim f As New frmEsperar
        f.Show()
        Application.DoEvents()
        Shell(comando, AppWinStyle.Hide, True, 40000)
        f.Close()

    End Sub

    Private Sub SeleccionarArchivos(group As String)
        Dim carpeta As String

        Select Case group
            Case "lote"
                carpeta = "c:\ALARM\LOTES"
        End Select

        'le indicamos el path que queremos  
        Dim ContadorDeArchivos As System.Collections.ObjectModel.ReadOnlyCollection(Of String)
        'nos devuelve la cantidad de archivos
        ContadorDeArchivos = My.Computer.FileSystem.GetFiles(carpeta)
        lblLoteNumero.Text = ContadorDeArchivos.Count

    End Sub

    Private Sub ProcesarLote()

        Dim carpeta As String = "c:\ALARM\LOTES"

        Try
            Me.Cursor = System.Windows.Forms.Cursors.WaitCursor

            'cn.BeginTransaction() Lo deshabilito porque los archivos pueden repetir registros de archivos anteriores y entonces no se puede hacer un contador correcto de registros a insertar

            'Recorro todos los archivos seleccionados
            For Each Archivo As String In My.Computer.FileSystem.GetFiles(carpeta, FileIO.SearchOption.SearchAllSubDirectories, "*.csv")

                Dim CSVTest As List(Of String) = New List(Of String)
                'Read the file and put each line into a list.  Each line will be an item with subitems in the listview
                CSVTest = System.IO.File.ReadAllLines(Archivo).ToList

                'This adds the rest of the data from the file to the listview.  If the first line of the file is data and not header text, then change `For I = 1 To CSVTest.Count - 1` to `For I = 0 To CSVTest.Count - 1`
                'Recorro cada registro del archivo
                For I = 3 To CSVTest.Count - 1
                    procesados = procesados + 1
                    Dim col() As String = CSVTest(I).Split(ControlChars.NewLine)
                    Dim NewLVItem As ListViewItem = New ListViewItem(col(0))
                    NewLVItem.Name = col(0)
                    For j = 1 To col.Count - 1
                        NewLVItem.SubItems.Add(col(j))
                    Next
                    'MsgBox(NewLVItem.Name)

                    Dim Text, DelimitedText() As String, Delimiter As Char = ControlChars.Tab
                    Text = NewLVItem.Name
                    DelimitedText = Text.Split(ControlChars.Tab)

                    'Separo cada campo separado por TABULACION del registro
                    For k = 0 To DelimitedText.GetUpperBound(0)
                        If DelimitedText(k).Trim <> "" Then
                            Select Case k
                                Case 0
                                    group = DelimitedText(k)
                                Case 1 'Date
                                    varDate = "20" & DelimitedText(k)
                                    'varDate = DelimitedText(k)
                                Case 2 'Time
                                    time = DelimitedText(k)
                                Case 3 'User Name
                                    usuario_tratadora = DelimitedText(k)
                                Case 4 'Message
                                    'Separo cada valor separado por "," del campo message
                                    message = Split(DelimitedText(k), ",")
                                Case Else
                                    MsgBox("El archivo que esta procesando tiene más campos que los esperados", vbExclamation + vbOKOnly, "Atención")
                                    Exit Sub

                            End Select
                        End If
                    Next

                    'VALIDO ENCABEZADO-------------------------------
                    'Chequeo si el grupo del archivo es correcto
                    If group <> "LOTE" Then
                        'cn.RollbackTransaction()
                        Me.Cursor = System.Windows.Forms.Cursors.Default
                        MsgBox("El archivo ingresado no pertenece a la tipologia elegida. Por favor ingrese un archivo válido", vbExclamation + vbOKOnly, "ATENCIÓN")
                        Exit Sub
                    End If

                    'Hago esto para descomponer message(0) que es el nombre de la tratadora y agregarle ceros a la izquierda de la serie hasta llegar a 3 digitos
                    Dim strNombreTratadora
                    strNombreTratadora = Strings.Left(message(0), InStr(message(0), "-"))
                    Dim strSerie As String
                    strSerie = Strings.Right(message(0), Len(message(0)) - InStr(message(0), "-"))
                    strSerie = strSerie.PadLeft(3, "0")

                    'Lo vuelvo a componer con los ceros a la izquierda en strSerie
                    message(0) = strNombreTratadora & strSerie

                    'Chequeo si el nombre de la tratadora es la que corresponde a la tratadora seleccionada
                    If message(0) <> varNombreTratadora Then
                        'cn.RollbackTransaction()
                        Me.Cursor = System.Windows.Forms.Cursors.Default
                        MsgBox("Los archivos que intenta procesar pertenecen a la tratadora " & message(0), vbExclamation + vbOKOnly, "ATENCIÓN")
                        Exit Sub
                    End If
                    '-------------------------------------------------

                    'VALIDO REGISTROS
                    If Validar("lotes") = True Then
                        InsertarRegistro("lotes")
                    End If

                Next

            Next Archivo

            'Resultados
            lblGrupo.Text = "LOTE"
            lblArchivos.Text = My.Computer.FileSystem.GetFiles(carpeta, FileIO.SearchOption.SearchAllSubDirectories, "*.csv").Count
            lblProcesados.Text = procesados
            lblIncorrectos.Text = incorrectos
            lblRepetidos.Text = repetidos
            lblInsertados.Text = insertados

            lblLoteNumero.Text = 0
            btnLoteProcesar.Visible = False

            'cn.CommitTransaction()

            Me.Cursor = System.Windows.Forms.Cursors.Default

            MsgBox("Fin de proceso", vbOKOnly + MsgBoxStyle.Information)


        Catch ex As Exception
            'cn.RollbackTransaction()
            Me.Cursor = System.Windows.Forms.Cursors.Default
            MensajeError()

        Finally
            'Limpio contadores
            procesados = 0
            incorrectos = 0
            repetidos = 0
            insertados = 0
        End Try

    End Sub

    Private Sub EliminarArchivos(group As String)
        Dim carpeta As String
        Select Case group
            Case "lote"
                carpeta = "c:\ALARM\LOTES"
        End Select

        For Each Archivo As String In My.Computer.FileSystem.GetFiles(carpeta, FileIO.SearchOption.SearchAllSubDirectories, "*.csv")

            My.Computer.FileSystem.DeleteFile(Archivo, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.SendToRecycleBin, FileIO.UICancelOption.DoNothing)

        Next Archivo
    End Sub

End Class